/**
 * Copyright (c) [2025] [何屹林]
 *
 * 保留所有权利。
 *
 * 文件名称：logic.h
 * 模块功能说明：
 * 该模块实现全局的逻辑处理，作为核心中的核心，实现了所有的逻辑函数并提供了调用接口。
 *
 * 华南师范大学-计算机学院-网络工程-1班
 * 作者：何屹林-20222132023
 * 完成日期：2025年7月24日
 */

#ifndef LOGIC_H
#define LOGIC_H

#include "utils.h"
#include "NFA_maker.h"
#include "DFA_maker.h"
#include "mindfa.h"
#include "presolve.h"
#include "TreeGraph.h"
#include "TreeModel.h"
#include "LR0.h"
#include "LR1.h"

class Logic                                 //逻辑类
{

public:

    bool clear();

    bool analysis(QString);
    void extend();              //文法扩充
    bool loadLex(const QString&);
    void getContent(QString content){getText=content;};
    void beginWork();
    bool compileAndRunCode(const QString& cppPath, const QStringList& exeArguments);

    bool isLr1TableEmpty()const {return LR1Table.isEmpty();} ;
    bool isLexEmpty()const {return Lexs.isEmpty();};
    bool isNFATableEmpty()const {return NFATable.isEmpty();};
    bool isDFATableEmpty()const {return DFATable.isEmpty();};
    bool isMiniDFATableEmpty()const {return MinDFATable.isEmpty();};
    bool isLexCodeEmpty()const {return LexCode.isEmpty();}
    const QString getLexCode() {return LexCode;}


    TreeModel* genTreeModel(QObject* ui){treeModel =new TreeModel(ROOT,ui); return treeModel;};
    ASTGraphicsScene* genTreeGraph(QObject* ui,int width){ASTGraphicsScene* graph =new ASTGraphicsScene(ROOT,ui,width); return graph;};

    bool isSLR1();
    QString getSLR1Warning()const{return SLR1Warning;}
    void NFATableShow(const QString&);
    void DFATableShow(const QString&);
    void MiniDFATableShow(const QString&);
    void firstFollowShow(const QString&,const QStringList&);
    void lr0_DfaShow(const QString&);
    void lr1_DfaShow(const QString&);
    void lr1_TableShow(const QString&);
    QVector<QVector<QString>> lr1_ProcessShow();

    void formShow(QString,QStringList,QStringList,QVector<QVector<QString>>);

private:
    void buildNFA();

    void presolve();

    void genNFA();
    void genDFA();
    void genMiniDFA();

    void DFA_maker();
    void genLexer();
    void delNFAs();

    void genHeader();
    void genmap();
    void genState();
    void genTools();
    void genIsCharSet();
    void genCores();
    void genMain();

    QString mapToString(const QMap<QString, int>& map) ;

    QSet<QString> get_first(QString s);
    void get_follow();


//表达式分析

    TreeModel* treeModel;


    QString getText;

    // 表格数据
    QVector<QVector<QString>> NFATable, DFATable, MinDFATable;

    //生成代码
    QString LexCode;


 //文法分析
    SyntaxNode *ROOT;

    // 起始符
    QString start_sign;

    // 存储非终结符
    QVector<QString> nonFinalizers;

    // 存储文法规则
    QHash<QString, QSet<QStringList>> grammars;

    // first集合与follow集合
    QHash<QString, QSet<QString>> first_set;
    QHash<QString, QSet<QString>> follow_set;

    // 规约规则存储
    QVector<Item> recursion;

    // LR1_table
    QVector<QVector<LR1_table_item>> LR1Table;
    QStringList actionList;

    QVector<Lex>Lexs;
    QVector<QString> reduceList_1;
    QVector<Lex> analysisStack;             //分析栈

    QVector<Gram> Grams;

    QString SLR1Warning;
};


#endif // LOGIC_H
